package com.itheima.servlet;

import com.itheima.pojo.User;
import com.itheima.service.UserService;
import com.itheima.service.impl.UserServiceImpl;
import com.itheima.utils.Result;
import com.itheima.utils.UUIDUtils;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/user")
public class UserServlet extends BaseServlet {

    private UserService userService = new UserServiceImpl();

    //注册
    public void register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, InvocationTargetException, IllegalAccessException {

        //获取表单的请求参数
        Map<String, String[]> map = request.getParameterMap();
        //创建User对象 封装参数
        User user = new User();

        //利用BeanUtils工具类封装对象
        BeanUtils.populate(user, map);
        //给user设置UID
        String uuid = UUIDUtils.getUUID();
        user.setUid(uuid);
        //设置激活状态
        user.setState(1);

        //调用service层注册方法 返回boolean
        boolean flag = userService.register(user);

        //判断是否注册成功
        if (flag) {
            //把信息封装到Result对象中
            //调用Base公共方法,把result对象转换成json格式 响应回去
            printResult(Result.SUCCESS,"注册成功,即将跳转到登录界面...",response);

        } else {
            printResult(Result.FAILS,"注册失败...",response);
        }

    }

    //登陆
    public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, InvocationTargetException, IllegalAccessException {

        //获取请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //调用service层方法
        User user = userService.login(username, password);
        //判断
        if (user == null){
            //登陆失败
            printResult(Result.FAILS,"用户名或密码错误",response);

        } else {
            //登陆成功
            //把信息封装到Result对象中
            //调用Base公共方法,把result对象转换成json格式 响应回去
            printResult(Result.SUCCESS,"登陆成功,即将跳转到主页",response);

                //将用户信息存入session
                request.getSession().setAttribute("user",user);

                //如果登录成功 那么我们把用户名 存到cookie中传递到浏览器上，显示在页面上Header.html上
                Cookie cookie = new Cookie("username",username);
                //如果设置中文
                //Cookie cookie = new Cookie("张三",URLEncoder.encode(username,"utf-8"));

                //设置Path ,Path + name -> cookie的唯一性,cookie的携带路径不同，名称可以重复
                //可在同一应用服务器内共享方法：设置cookie.setPath("/");
                cookie.setPath("/");
                //设置cookie存活期
                cookie.setMaxAge(60*10);
                /*
                //因为处于的跨域请求，要求cookie具备识别域名的能力
                //后端 api.itheimashop.com  前端www.itheimashop.com
                //跨域共享cookie的方法：设置cookie.setDomain(".ithemashop.com");
                //要想写入的cookie被其子域名共享，域名前面必须加一个英文的.
                */
                cookie.setDomain("itheimashop.com");
                /*
                //response.addCookie(c)一旦执行，服务器端会自动发回消息头set-cookie给浏览器，
                //set-cookie是会携带cookie键值对的，创建的cookie就会保存在浏览器。
                //所以创建的cookie是会保存在浏览器上的
                response.addCookie(cookie);这不是先放到response头中了么?然后去客户端.放到客户端的机器上.
                然后它要是再访问你的服务器时就会带着这些cookie并在request中放置着来找你.
                */
                response.addCookie(cookie);

        }
    }
    //退出登录
    public void logout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //退出后删除session和cookie

        //销毁session
        //invalidate() 清除session的所有信息
        request.getSession().invalidate();
        //在cookie的API中没有提供直接将cookie删除的方法
        //可以向浏览器再发送一个同名的cookie，并设置cookie的最大生存时间为零
        Cookie cookie = new Cookie("username","");
        cookie.setPath("/");
        cookie.setMaxAge(0);
        //跨域
        cookie.setDomain("itheimashop.com");
        response.addCookie(cookie);

        //调用Base公共方法,把result对象转换成json格式 响应回去
        printResult(Result.SUCCESS,"退出登录,即将跳转到登录页面",response);
    }

}
